/*
维护两个数组，一个记录上限，一个记录下限
每次给出的界限，和已经记录的界限对比，有意义就更新
*/
#include <bits/stdc++.h>

using namespace std;

int main(int argc, char const *argv[])
{
	int T;scanf("%d",&T);

	int cnt=0;
	while(cnt++<T){
		int n,m,q;scanf("%d%d%d",&n,&m,&q);
		std::vector<int> vmax(n+1),vmin(n+1);
		for (int i = 1; i < n+1; ++i)	//初始化
		{
			vmax[i]=-1;
			vmin[i]=m+1;
		}
		for (int i = 0; i < q; ++i)
		{
			int op,k;scanf("%d%d",&op,&k);
			int arr[k],l,r;
			for (int i = 0; i < k; ++i)
			{
				scanf("%d",&arr[i]);
			}
			scanf("%d%d",&l,&r);
			for (int i = 0; i < k; ++i)		//对比
			{
				int tmp=arr[i];
				if(l<vmin[tmp]){
					vmin[tmp]=l;
				}
				if(r>vmax[tmp]){
					vmax[tmp]=r;
				}

			}
		}
		int ansmin=0,ansmax=0;
		for (int i = 1; i < n+1; ++i)
		{
			/*有的值没有记录的，取默认值*/
			if(vmin[i]!=m+1){
				ansmin+=vmin[i];
			}else{
				ansmin+=1;
			}
			if(vmax[i]!=-1){
				ansmax+=vmax[i];
			}else{
				ansmax+=m;
			}
		}
		printf("%d %d\n",ansmin,ansmax);
	}

	return 0;
}